package org.ala.tiktools.rpc.client_server.client;

import org.ala.tiktools.rpc.plugin.load_balance.ILoadBalance;
import org.ala.tiktools.rpc.plugin.load_balance.selector.ISelector;
import org.ala.tiktools.rpc.plugin.node.INodeCreator;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

/**
 * rpc client 注解
 *
 * @author ala
 * @date 2025-04-05 23:06
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AlaRpcClient {
    /**
     *  对方的服务名
     */
    @AliasFor("value")
    String name() default "";
    /**
     *  对方的服务名
     */
    @AliasFor("name")
    String value() default "";
    /**
     *  对方的hosts
     *  <p> host:port;host2:port2 格式
     *  <p> name|value 与 hosts不能全为空
     */
    String hosts() default "";


    /**
     *  代理bean名字
     *  <p> 默认接口全名（package路径 + 全名）
     */
    String contextId() default "";


    /**
     *  根url
     *  <p> 请求路径会追加进每个method的url前缀
     */
    String path() default "";
    /**
     *  一次请求timeout，会覆盖全局配置
     *  <p> -1：不限时  |  -1：全局配置
     */
    long timeout() default 0;


    /**
     *  是否私有
     *  <p> 若私有会给该client提供独立的LoadBalance
     *  <p> 单独自定LoadBalance也能达到同样的效果
     */
    boolean privately() default false;
    /**
     *  单独指定的LoadBalance
     *  <p> 不配默认全局的
     *  <p> 通过class拿bean，拿不到new一个
     *  <p> 允许多个client指定相同的LoadBalance，此时多个client共用一个LoadBalance
     *  <p> 这里指定成数组，是为了兼容空值。实际只有[0]生效
     */
    Class<? extends ILoadBalance>[] loadBalanceClass() default {};
    /**
     *  单独指定的节点创建器
     *  <p> 允许单独指定不同的协议
     *  <p> 不配默认全局的
     *  <p> 通过class拿bean，拿不到new一个
     *  <p> 这里指定成数组，是为了兼容空值。实际只有[0]生效
     */
    @SuppressWarnings("rawtypes")
	Class<? extends INodeCreator>[] nodeCreator() default {};
    /**
     *  节点选择器
     *  <p> 允许单独指定不同的select算法
     *  <p> 不配默认全局的
     *  <p> 通过class拿bean，拿不到new一个
     *  <p> 这里指定成数组，是为了兼容空值。实际只有[0]生效
     */
    Class<? extends ISelector>[] nodeSelector() default {};
}
